﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Generic_and_FIFO
{
    class Program
    {
        static void Main(string[] args)
        {
            GenericTemplate<string> demoGen = new GenericTemplate<string>(5);
            demoGen.Push("Первый");
            demoGen.Push("Второй");
            demoGen.Push("Третий");
            demoGen.Push("Четвертый");
            demoGen.Push("Пятый");
            demoGen.Push("Шестой");
            demoGen.Push("Седьмой");


            Console.WriteLine("Сколько раз пОпить?");
            int goOut = Int32.Parse(Console.ReadLine());
            for (int i = 0; i < goOut; i++)
            {
                Console.WriteLine("Первый в очереди был - {0}. На выход, блеать!", demoGen.Pop());

            }

        }
    }

    class GenericTemplate<T>
    {
        T[] array;
        private int indexOfLast;
        private int indexOfFirst;

        public GenericTemplate(int arraySize)
        {
            array = new T[arraySize];
        }

        public void Push(T element)
        {
            if (indexOfLast >= array.Length)
            {
                indexOfLast = 0;
            }
            array[indexOfLast] = element;
            indexOfLast++;
        }

        public T Pop()
        {
            if (indexOfFirst >= array.Length)
            {
                indexOfFirst = 0;
            }
            T returnValue = array[indexOfFirst];
            indexOfFirst++;
            return returnValue;
        }

        public void Clear()
        {
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = default(T);
            }
            indexOfLast = 0;
            indexOfFirst = 0;
        }

    }

}
